package controller;

import model.FileRules;
import org.junit.Test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;

/**
 * @author zhangshuo
 * @create 2022-01-13-16:18
 */
public class OperationFile1 {


    //测试删除文件中某行字符的方法
    @Test
    public void test01() throws IOException {

        OperationFile1 o2 = new OperationFile1();
        String str1 = "小明";

        o2.deleteString(str1,0,FileRules.pathSt);

    }

    //测试获取特定长度信息的方法，例：过滤智慧教室
    @Test
    public void test02() throws IOException {

        OperationFile1 o2 = new OperationFile1();
        StringBuffer stringBuffer;

        stringBuffer =  o2.getDeterminedLength(8,0,FileRules.pathRe);

        System.out.println(stringBuffer);
    }

    //测试获取特定信息的方法，例：过滤智慧教室
    @Test
    public void test03() throws IOException {

        OperationFile1 o2 = new OperationFile1();
        StringBuffer stringBuffer;

        stringBuffer =  o2.getDeterminedString("普通教室",1,FileRules.pathCl);

        System.out.println(stringBuffer);
    }

    //测试查找两个文件中相等信息的方法
    @Test
    public void test04() throws IOException {

        OperationFile1 o2 = new OperationFile1();
        StringBuffer stringBuffer;

        stringBuffer =  o2.getSameString(0,3,FileRules.pathRe,FileRules.pathSt);

        System.out.println(stringBuffer);
    }


    /**
     *从文件中删除一条或多条特定信息的方法
     * @param str1 这个参数表示要删除的内容，例如一个账号
     * @param i  这个参数表示str1在一条信息中所处的位置，例如账号在（账号-密码）这个结构中所处的位置是 0 ；
     * @param path  这个参数表示要处理的文件的路径；
     * @throws IOException
     */
    public void deleteString(String str1,int i,String path) throws IOException {

        String[] users;//创建了一个数组用来当中介

        //把文件中符合条件的信息，写入一个集合
        File file = new File(path);
        FileInputStream intput = new FileInputStream(file);
        BufferedReader reader = new BufferedReader(new InputStreamReader(intput));
        String str;//定义一个字符串，每一次读出该行字符串内容
        String tempString;//定义一个字符串，用来存放截取后的字符串
        List<String> list = new ArrayList<>();//定义一个list字符串集合用来储存每一行的字符串信息
        while ((str = reader.readLine()) != null) {
            //字符串截取，去掉第一个和最后一个
            tempString = str.substring(1,str.length()-1);
            users = tempString.split("-");

            //符合条件则加入集合
            if (!str1.equals(users[i])) {
                list.add(tempString);
            }
        }

        //清空文件
        FileWriter fd = new FileWriter(file, false);//append传入false表示写入内容时将会覆盖文件中之前存在的内容
        fd.write("");//执行删除操作，写入空内容覆盖之前的内容
        fd.close();

        //重新遍历一遍更改后的集合，将内容重新写入文件内
        int n = 0;
        for (String userinf : list) {
            n++;
            FileWriter fw = new FileWriter(file, true);//append传入true表示写入内容时将不会覆盖文件中之前存在的内容，将新的内容写在之前内容的后面

            fw.write("(" + userinf + ")");
            if (n < list.size()){
                fw.write(System.getProperty("line.separator"));//在段落后添加一个换行符
            }
            fw.close();
        }
    }

    /**
     * 获取文件中特定长度信息的方法
     * @param length 这个参数表示要获取信息的长度，例如学生账号，长度为
     * @param i  这个参数表示str1在一条信息中所处的位置，例如账号在（账号-密码）这个结构中所处的位置是 0 ；
     * @param path  这个参数表示要处理的文件的路径；
     * @throws IOException
     */
    public StringBuffer getDeterminedLength(int  length,int i,String path) throws IOException {

        String[] users;//创建了一个数组用来当中介
        //将文件中的信息存入一个集合中
        File file = new File(path);
        FileInputStream intput = new FileInputStream(file);
        BufferedReader reader = new BufferedReader(new InputStreamReader(intput));
        String str;//定义一个字符串，每一次读出该行字符串内容
        String tempString;//定义一个字符串，用来存放截取后的字符串
        List<String> list = new ArrayList<>();//定义一个list字符串集合用来储存每一行的字符串信息
        while ((str = reader.readLine()) != null) {

            //字符串截取，去掉第一个和最后一个
            tempString = str.substring(1,str.length()-1);
            users = tempString.split("-");

            //判断某个字符串长度，符合条件则加入集合
            if (users[i].length() == length) {
                list.add(tempString);
            }
        }

        //遍历集合中的剩余信息，写入StringBuffer中
        StringBuffer stringBuffer = new StringBuffer();
        for (String userinf : list) {
            stringBuffer.append( "(" + userinf + ")" );
            stringBuffer.append("\n");
        }

        return stringBuffer;
    }


    /**
     * 获取文件中特定信息的方法，输出的格式为(A111-阶梯教室-30~40-空闲-无)
     * @param str1 这个参数表示要获取的内容，例如：获取所有普通教室的相关信息，此时str1为普通教室；
     * @param i  这个参数表示str1在一条信息中所处的位置，例如普通教室在(A101-智慧教室-30~40-空闲-无)这个结构中所处的位置是 1；
     * @param path  这个参数表示要处理的文件的路径；
     * @throws IOException
     */
    public StringBuffer getDeterminedString(String str1,int i,String path) throws IOException {

        String[] users;//创建了一个数组用来当中介

        //将文件中符合条件的信息写入集合中
        File file = new File(path);
        FileInputStream intput = new FileInputStream(file);
        BufferedReader reader = new BufferedReader(new InputStreamReader(intput));
        String str;//定义一个字符串，每一次读出该行字符串内容
        String tempString;//定义一个字符串，用来存放截取后的字符串
        List<String> list = new ArrayList<>();//定义一个list字符串集合用来储存每一行的字符串信息
        while ((str = reader.readLine()) != null) {

            //字符串截取，去掉第一个和最后一个
            tempString = str.substring(1,str.length()-1);
            users = tempString.split("-");

            //符合条件则加入集合
            if (str1.equals(users[i])) {
                list.add(tempString);
            }
        }


        //集合中的剩余信息遍历，写入StringBuffer中
        StringBuffer stringBuffer = new StringBuffer();
        for (String userinf : list) {
            stringBuffer.append( "(" + userinf + ")" );
            stringBuffer.append("\n");
        }

        return stringBuffer;
        }


    /**
     * 查找两个文件中的信息并返回相等的部分，例从注册文件和学生文件中查找已注册学生的信息，并返回学生的信息；
     * @param i1  这个参数表示要对比的信息在文件1中的位置，例：账号在（账号-密码）这个结构中所处的位置是 0；
     * @param i2  这个参数表示要对比的信息在文件2中的位置，例：账号在(姓名-性别-年龄-账号-年级)这个结构中所处的位置是3；
     * @param path1  文件1的路径；例：注册信息文件；
     * @param path2  文件2的路径；例：学生信息文件；
     * @throws IOException
     */
    public StringBuffer getSameString(int i1,int i2,String path1,String path2) throws IOException {

        String[] users1;//创建了一个数组用来当中介
        String[] users2;//创建了一个数组用来当中介

        //查找两个文件中的内容，相等的部分返回到StingBuffer中
        File file1 = new File(path1);
        FileInputStream intput1 = new FileInputStream(file1);
        BufferedReader reader1 = new BufferedReader(new InputStreamReader(intput1));
        String str1;//定义一个字符串，每一次读出该行字符串内容
        String tempString1;//定义一个字符串，用来存放截取后的字符串

        File file2 = new File(path2);
        FileInputStream intput2 = new FileInputStream(file2);
        BufferedReader reader2 = new BufferedReader(new InputStreamReader(intput2));
        String str2;//定义一个字符串，每一次读出该行字符串内容
        String tempString2;//定义一个字符串，用来存放截取后的字符串

        List<String> list = new ArrayList<>();//定义一个list字符串集合用来储存相等的信息

        while ((str1 = reader1.readLine()) != null) {

            //字符串截取，去掉第一个和最后一个
            tempString1 = str1.substring(1,str1.length()-1);
            users1 = tempString1.split("-");

            while ((str2 = reader2.readLine()) != null) {

                //字符串截取，去掉第一个和最后一个
                tempString2 = str2.substring(1,str2.length()-1);
                users2 = tempString2.split("-");
                //符合条件则加入集合
                if (users1[i1].equals(users2[i2])) {
                    list.add(tempString2);
                }
            }
        }

        //集合中的剩余信息遍历，写入StringBuffer中
        StringBuffer stringBuffer = new StringBuffer();
        for (String userinf : list) {
            stringBuffer.append( "(" + userinf + ")" );
            stringBuffer.append("\n");
        }
        return stringBuffer;
    }


}


